import router from '@/router'
import store from '@/store'
// import NProgress from 'nprogress'
// 第一种方法
// router.beforeEach((to, from, next) => {
//   if (store.getters.token) {
//     //   有登录
//     if (to.path === '/login') {
//       next('/')
//     } else {
//       next()
//     }
//   } else {
//     const whiteList = ['/login', '/404', '/test']
//     if (whiteList.indexOf(to.path) > -1) {
//       // 如果目的在白名单种，就放行
//       next()
//     } else {
//       next('/login')
//     }
//   }
//   NProgress.done()
// })

// 第二种方法
// router.beforeEach((to, from, next) => {
//   const url = to.path
//   const token = store.getters.token
//   const whiteList = ['/404', '/login', '/test']

//   if (token && url === '/login') {
//     next('/')
//   }

//   if (token && url !== '/login') {
//     next()
//   }

//   if (!token && whiteList.indexOf(url) > -1) {
//     next()
//   }

//   if (!token && whiteList.indexOf(url) === -1) {
//     next('/login')
//   }
// })

// 第三种方法
router.beforeEach(async(to, from, next) => {
  const url = to.path
  const token = store.getters.token
  const whiteList = ['/404', '/login', '/test']

  // 1有登录 去登录 首页
  if (token && url === '/login') {
    next('/')
  }
  //   2.有登录 不去登录页 放行
  if (token && url !== '/login') {
    // 这里是一般后台页面走的逻辑分支
    // 如果在这发送用户数据请求,可以保证
    // 每个页面都一定能够得到用户数据
    // 不过这里不能单独判断对象, 需要判断里面的值
    // 否则 {} 空对象在判断时永远转换为 true
    if (!store.getters.name) {
      // 刷新进入页面时,没有数据,应该获取
      // 但是如果已经在页面里面, 在进行跳转
      // 因为之前数据已经那个, 就不需要再拿
      await store.dispatch('user/getUserInfo')
      // 让数据加载完后权限筛选拦截
      const res = await store.dispatch('permission/filterRouter', store.getters.menus)
      // console.log(res)
      // 添加筛选后的路由
      router.addRoutes([
        ...res,
        // 解决菜单还没回复 另外刷新会报404
        // res上的路由匹配不上再走404
        { path: '*', redirect: '/404', hidden: true }
      ])
      // 解决空白页
      next(to.path)
      return
    }
    next()
  }
  //   3.没登陆 在白名单 放行
  if (!token && whiteList.includes(url)) {
    next()
  }
  // 4.没登录 不在百名单 登录首页
  if (!token && !whiteList.includes(url)) {
    next('/login')
  }
})
